package com.doit.day06

object _10_逆变协变不变 {
  def main(args: Array[String]): Unit = {

    class Box[T](t:T)

    class Pencil

    class YZPencil extends Pencil

    /**
     * 本身我的pencil 和YZpencil 是父子关系
     * 那么按照常理来说，我装笔的盒子也是圆珠笔的盒子的父类，这样的话咱们能够理解
     * 我盒子既然能装笔，而且圆珠笔又是笔的父类，所以我这个盒子应该能装圆珠笔
     * 毕竟有多态的存在，我的笔本身可以接收圆珠笔的 ==>理解 ?
     */
    val box1: Box[Pencil] = new Box[Pencil](new Pencil)

    val box2: Box[YZPencil] = new Box[YZPencil](new YZPencil)

    //但是在代码中，却不能这么操作  虽然圆珠笔和笔存在父子关系，但是一旦把他们装在盒子中，就不存在这样的关系了
    //这种的关系我们称他为不变
    //    val box3: Box[Pencil] = new Box[YZPencil](new YZPencil)  //报错

    //如果想让他们依然有关系，可以的，scala给我提供了另外一种方式叫协变和逆变
    class Box1[+T](t:T)
    class Pencil1
    class YZPencil1 extends Pencil1
    //本身圆珠笔是笔的子类，加上了协变这么一个操作  那么装笔的盒子就是装圆珠笔的父类了
    val box3: Box1[Pencil1] = new Box1[YZPencil1](new YZPencil1)





    // 逆变
    //如果想让他们依然有关系，可以的，scala给我提供了另外一种方式叫协变和逆变
    class Box2[-T](t:T)
    class Pencil2
    class YZPencil2 extends Pencil2
    //本身圆珠笔是笔的子类，加上了逆变这么一个操作  那么装笔的盒子就是装圆珠笔的子类了(父子关系颠倒过来了)
    val box4: Box2[YZPencil2] = new Box2[Pencil2](new Pencil2)
  }

}
